package com.zb.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zb.entity.AccounLoginInfo;
import com.zb.entity.SelectVo;
import com.zb.entity.UserInfo;
import com.zb.entity.ZjUser;
import com.zb.exception.SMSException;
import com.zb.mobile.UserMobileInfoVo;
import com.zb.vo.*;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author WEN
 * @since 2023-08-08
 */
public interface ZjUserService extends IService<ZjUser> {

    /**
     * 新增用户
     * @param accountLoginInfo 登录账号信息
     * @param userVo
     */
    void save(AccounLoginInfo accountLoginInfo, UserVo userVo);

    /**
     * 新增用户
     * @param loginInfo
     * @param userInfo
     * @return
     */
    Long save(AccounLoginInfo loginInfo, UserInfo userInfo);

    /**
     * 新增用户
     * @param custAccId 商家ID
     * @param phone 手机号
     * @return
     */
    ZjUser save(Long custAccId, String phone, String password);

    /**
     * 获取用户列表
     * @param custAccId 商家ID
     * @param selectVo 查询条件
     * @return
     */
    List<UserListVo> getList(Long custAccId, UserSelectVo selectVo);

    /**
     * 获取用户列表总记录数
     * @param custAccId 商家ID
     * @param selectVo 查询条件
     * @return
     */
    long getListCount(Long custAccId, UserSelectVo selectVo);

    /**
     * 获取用户账号信息
     * @param id 用户ID
     * @return
     */
    UserAccountVo getUserAccount(Long id);

    /**
     * 批量更改用户状态
     * @param idList 用户ID集合
     * @param status 状态：0-正常，1-冻结，2-禁用
     */
    void updateBatchStatusByIds(List<Long> idList, Integer status);

    /**
     * 查询用户级别是否存在
     * @param userLevelIdList 用户级别ID集合
     * @return
     */
    List<String> existLevelTypeByUserLevelIds(List<Long> userLevelIdList);

    /**
     * 根据类型ID集合查询是否存在
     * @param typeIdList 用户分类ID集合
     * @return
     */
    List<String> existTypeByTypeIds(List<Long> typeIdList);

    /**
     * 分页获取用户下拉数据列表
     * @param custAccId 商家ID
     * @param selectVo 搜索条件
     * @return
     */
    Map<String, Object> pageSelect(Long custAccId, SelectVo selectVo);

    /**
     * 根据手机号查询
     * @param custAccId 商家ID
     * @param phone 手机号
     * @return
     */
    ZjUser getByPhone(Long custAccId, String phone);

    /**
     * 根据登录账号查询
     * @param custAccId 商家ID
     * @param account 账号
     * @return
     */
    ZjUser getByAccount(Long custAccId, String account);


    /**
     * 校验手机号是否注册
     * @param custAccId  商家ID
     * @param phone 手机号
     * @return 返回：true-已注册，false-未注册
     */
    boolean isRegisterPhone(Long custAccId, String phone);

    /**
     * 根据用户更新最后登录时间
     * @param id 用户ID
     */
    void updatelastLoginTimeByLogin(Long id);

    /**
     * 登录页面的重置密码
     * @param custAccId 商家ID
     * @param userPasswordVo 密码对象
     */
    void logInRestPwd(Long custAccId, UserPasswordVo userPasswordVo) throws SMSException;

    /**
     * 修改密码
     * @param userId 客户ID
     * @param userPasswordVo 密码对象
     */
    void updatePwd(Long userId, UserPasswordVo userPasswordVo) throws SMSException;

    /**
     * 查询是否已绑定手机号
     * @param userId 客户ID
     * @return 返回：false-未绑定，true-已绑定
     */
    boolean isBindingPhone(Long userId);

    /**
     * 绑定手机号
     * @param userId
     * @param phone
     * @param code
     */
    void bindingPhone(Long userId, String phone, String code) throws SMSException;

    /**
     * 新增/修改联系人地址
     * @param logintInfo
     * @param userContactVo
     */
    void saveUserContactAddress(AccounLoginInfo logintInfo, UserContactVo userContactVo);

    /**
     * 编辑个人资料
     * @param userId 客户ID
     * @param userMobileInfoVo
     */
    void updateMobileUserInfo(Long userId, UserMobileInfoVo userMobileInfoVo);

    /**
     * 更新客户知识库查看权限
     * @param id 客户ID
     * @param selectKnowledgeAuthor 知识库查看权限：false-查看所有，true-根据客户分类查看
     */
    void updateSelectKnowledgeAuthor(Long id, boolean selectKnowledgeAuthor);

    /**
     * 获取出入库客户下拉数据列表
     * @param custAccId 商家ID
     * @param selectVo 搜索条件
     * @return
     */
    Map<String, Object> getStoreUserPageSelect(Long custAccId, SelectVo selectVo);

    /**
     * 获取出库收货客户信息
     * @param custAccId 商家ID
     * @param selectVo 搜索条件
     * @return
     */
    Map<String, Object> getOutStoreUser(Long custAccId, SelectVo selectVo);

    /**
     * 获取报单客户下拉数据列表
     * @param custAccId 商家ID
     * @return
     */
    Map<String, Object> getOrderUserSelect(Long custAccId, UserSelectSearch search);
}
